package com.socialuni.center.web.controller.login;

import com.socialuni.sdk.api.model.ResultRO;
import com.socialuni.center.web.model.RO.CenterLoginRO;
import com.socialuni.center.web.model.RO.user.CenterMineUserDetailRO;
import com.socialuni.center.web.serive.login.AuthCodeService;
import com.socialuni.center.web.serive.user.CenterPhoneNumService;
import com.socialuni.center.web.user.login.CenterLoginService;
import com.socialuni.center.web.utils.CenterUserUtil;
import com.socialuni.sdk.model.BindPhoneVO;
import com.socialuni.sdk.model.DO.user.UserDO;
import com.socialuni.sdk.model.QO.phone.BindWxPhoneNumQO;
import com.socialuni.sdk.model.QO.phone.RefreshWxSessionKeyQO;
import org.hibernate.validator.constraints.Length;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * @author qinkaiyuan
 * @date 2019-02-17 14:14
 */
@RestController
@RequestMapping("socialuni/phone")
public class PhoneController {
    @Resource
    private AuthCodeService authCodeService;
    @Resource
    CenterPhoneNumService centerPhoneNumService;
    @Resource
    CenterLoginService centerLoginService;

    @Deprecated
    //下版本作废 2021-7-17，统一使用 login/providerLogin
    @PostMapping("appLogin")
    @ResponseBody
    public ResultRO<CenterLoginRO<CenterMineUserDetailRO>> appLogin(@RequestBody @Valid @NotNull BindPhoneVO loginVO) {
        //登录的时候如果没有手机号，则手机号注册成功，自动注册一个user，用户名待填，自动生成一个昵称，密码待填，头像待上传
        //如果已经登录过，则返回那个已经注册的user，根据手机号获取user，返回登录成功
        //记录用户错误日志
        CenterLoginRO<CenterMineUserDetailRO> userDetailROUniLoginRO = centerLoginService.providerAndPhoneLogin(null, loginVO);
        return new ResultRO<>(userDetailROUniLoginRO);
    }


    /**
     * 腾讯云手机验证码相关，手机号登陆和绑定都使用这里发送验证码
     *
     * @param phoneNum
     * @return
     * @throws Exception
     */
    @PostMapping("sendAuthCode")
    @ResponseBody
    public ResultRO<String> sendAuthCode(@Valid @NotBlank @Length(min = 11, max = 11) String phoneNum, HttpServletRequest request) {
        UserDO user = CenterUserUtil.getMineUser();
        return authCodeService.sendAuthCodeCheck(phoneNum, user, request);
    }

    /**
     * 如果填写了验证码
     * 1.如果用户已经注册，非新用户，//登录成功，不注册，提示603错误
     * 2.如果未注册，
     * 判断邀请码是否正确，错误，提示邀请码错误，请重新填写注册
     * 3.注册，赠送一个月会员 同4
     * 是否有邀请码，有邀请码额外赠送正确，
     * 4新用户新增一个会员订单，开通会员，设置是否会员，是否年会员，设置所有属性
     * 5.邀请人用户，判断是否已是年会员，是
     * 赠送清池币
     * 不是
     * 赠送会员
     * <p>
     * 用户登陆并绑定手机号功能 和 其他非微信小程序的用户绑定手机号都走着
     *
     * @param bindPhoneVO
     * @return
     */
    @PostMapping("bindPhoneNum")
    @ResponseBody
    public ResultRO<CenterMineUserDetailRO> bindPhoneNum(@RequestBody @Valid @NotNull BindPhoneVO bindPhoneVO) {
        //登录的时候如果没有手机号，则手机号注册成功，自动注册一个user，用户名待填，自动生成一个昵称，密码待填，头像待上传
        //如果已经登录过，则返回那个已经注册的user，根据手机号获取user，返回登录成功
        //记录用户错误日志
        CenterMineUserDetailRO centerUserDetailRO = centerPhoneNumService.userBindPhoneNum(bindPhoneVO);
        return new ResultRO<>(centerUserDetailRO);
    }

    /**
     * 微信小程序界面点击绑定手机号触发
     *
     * @param bindWxPhoneNumQO
     * @return
     */
    @PostMapping("bindPhoneNumByWx")
    @ResponseBody
    public ResultRO<CenterMineUserDetailRO> bindPhoneNumByWx(@RequestBody BindWxPhoneNumQO bindWxPhoneNumQO) {
        CenterMineUserDetailRO centerMineUserDetailRO = centerPhoneNumService.userBindWxPhoneNum(bindWxPhoneNumQO);
        return new ResultRO<>(centerMineUserDetailRO);
    }

    /**
     * 微信登录session过期，刷新session
     * @param refreshWxSessionKeyQO
     * @return
     */
    @PostMapping("refreshWxSessionKey")
    @ResponseBody
    public ResultRO<CenterMineUserDetailRO> refreshWxSessionKey(@RequestBody RefreshWxSessionKeyQO refreshWxSessionKeyQO) {
        centerPhoneNumService.refreshWxSessionKey(refreshWxSessionKeyQO);
        return new ResultRO<>();
    }

}
